package com.example.springboot.filter;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * 自定义Filter
 * <p> 实现 Filter 接口,重写doFilter方法.
 * <p> 用途:
 * <p> 1. 日志记录、请求统计（Request Logging）
 * <p> 2. 统一编码处理（UTF-8）
 * <p> 3. 跨域处理（CORS）
 * <p> 4. 权限验证、Token 校验
 * <p> 5. 请求/响应体修改（例如包装 Request 或 Response）
 * <p>
 * @author Zhang.Z
 * @version 2025-09-20
 */
public class CustomFilter implements Filter {

    /**
     * Filter 初始化，
     * 只会执行 一次，
     * 在 Filter 被容器加载时调用
     * <p> 用来做一些 一次性的资源初始化
     * <p> 例如： 读取 Filter 配置参数、
     * <p> 初始化缓存、读取配置文件等
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("filterName = " + filterConfig.getFilterName());
    }

    /**
     * 处理每一次请求，是 Filter 的核心方法
     * <p> 每次请求都会经过 doFilter
     * <p> 可以在请求前后做处理
     * <p> 必须调用 chain.doFilter(request, response) 才能继续执行下一个 Filter 或 Controller
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        //code:
        System.out.println("custom Filter 请求前 ,url :" + ((HttpServletRequest) request).getRequestURI());

        //放行, 继续调用下一个 Filter 或 Controller
        chain.doFilter(request, response);

        System.out.println("custom Filter 请求后 ,url :" + ((HttpServletRequest) request).getRequestURI());
    }

    /**
     * Filter 销毁时调用，只执行 一次
     * <p>当应用停止或 Filter 被卸载时执行
     * <p> 可以清理 <code>#init </code> 方法执行的资源
     *
     * @see #init
     */
    @Override
    public void destroy() {

    }
}
